/**
 * 
 */
package org.xlab.baseframework.service.api;

import java.util.List;

import org.springframework.transaction.annotation.Transactional;
import org.xlab.baseframework.annotation.Loggable;
import org.xlab.baseframework.domain.ISystemUserDomain;
import org.xlab.baseframework.domain.SystemWebServiceSession;
import org.xlab.baseframework.domain.enumerate.EnumWebServiceClientType;
import org.xlab.baseframework.domain.view.SystemWebServiceSessionVO;
import org.xlab.baseframework.exception.InactiveWebServiceSessionFoundexception;
import org.xlab.baseframework.exception.PermissionDeniedException;
import org.xlab.baseframework.exception.SystemWebServiceSessionNotFoundException;

/**
 * @author makubex
 * 
 */
public interface ISystemWebServiceSessionService extends
		IBaseService<SystemWebServiceSessionVO, SystemWebServiceSession> {

	/**
	 * 根据session标识检查session是否已经过期
	 * 
	 * @param sessionId session标识
	 * @return 是否过期
	 */
	public boolean checkExpired(String sessionId);
	
	/**
	 * 创建一个会话实体
	 * 
	 * @param createdBy 创建人
	 * @param clientId 客户端标识
	 * @param clientType 客户端类型
	 * @return sessionId
	 */
	@Loggable
	@Transactional
	public String createSession(ISystemUserDomain createdBy,String clientId,EnumWebServiceClientType clientType);

	/**
	 * 逻辑删除一个session实体
	 * 
	 * @param sessionId 会话标识
	 * @param deletedBy 移除者
	 * @throws SystemWebServiceSessionNotFoundException 如果该会话没有被找到，或者已经被删除
	 */
	@Loggable
	@Transactional
	public void deleteSession(String sessionId,ISystemUserDomain deletedBy)
			throws SystemWebServiceSessionNotFoundException;
	
	/**
	 * 根据clientId获取对应的正在活动的session实体
	 * 
	 * @param clientId 客户端标识
	 * @return 当前客户端对应的正在活动的session实体
	 * @throws SystemWebServiceSessionNotFoundException 如果当前客户端没有对应活动的session
	 */
	public SystemWebServiceSession findActiveSessionByClientId(String clientId) throws SystemWebServiceSessionNotFoundException;

	/**
	 * 查询系统中全部正在活动的Web service session
	 * 
	 * @return 所有正在活动的web service session
	 * @throws SystemWebServiceSessionNotFoundException 如果没有任何web service session被找到
	 */
	public List<SystemWebServiceSession> findAllActiveSession() throws SystemWebServiceSessionNotFoundException;
	
	/**
	 * 根据SessionID获取相关的session实体
	 * 
	 * @param sessionId 会话标识
	 * @return session实体
	 * @throws SystemWebServiceSessionNotFoundException 如果没有相应的Session实体被找到，或者已經被刪除
	 * @throws InactiveWebServiceSessionFoundexception 如果只找到了非活动状态的session
	 */
	public SystemWebServiceSession findBySessionId(String sessionId)
			throws SystemWebServiceSessionNotFoundException,InactiveWebServiceSessionFoundexception;
	
	/**
	 * 更新Session信息
	 * 
	 * @param sessionId 会话标识
	 * @param clientId 客户端标识
	 * @throws SystemWebServiceSessionNotFoundException 如果sessionId对应的Session实体没有被找到
	 * @throws PermissionDeniedException 如果sessionId对应的Session实体中的clientId与提供的clientId不一致
	 */
	@Loggable
	@Transactional
	public void updateStatus(String sessionId, String clientId)
			throws SystemWebServiceSessionNotFoundException,
			PermissionDeniedException;
	
}
